Appearance
Array.prototype.splice
- 参数问题:
- start:指定修改的开始位置(从0计数)。如果超出了数组长度,则从数组末尾开始添加内容。如果是负值,则表示从数组末尾开始的第几位(从-1计数,这意味着-n是倒数第n个元素并且等价于arr.length - n);如果负值的绝对值大于数组长度,则表示开始位置为第0位
- deleteCount:整数,表示要移除的数组元素的个数。如果deleteCount大于start之后的元素总数,则从start后面的元素都将被删除(含start)。如果deleteCount被省略了,或者它的值大于等于arr.length - start,那么start(含start)之后数组的所有元素都会被删除。如果deleteCount是0或者负数,则不移动元素
- item1,item2...:要添加进数组的元素,从start位置开始。如果不指定,则splice()将只删除元素
- 返回值由被删除的元素组成的一个数组。如果只删除一个元素,则返回只包含一个元素的数组。如果没有删除元素,则返回空数组
- 改变原数组
- 注意如果是插入值的话,是在start参数对应元素之前插入
重写splice方法目前对于我来说,暂时不太理解,先不写了,以后再来解决。如果有兴趣的可以看看ECMA262文件实现的过程
Array.prototype.concat
- 参数的问题:
- valueN:数组或者值,将被合并的一个新的数组中,如果省略了所有valueN参数,则concat会返回调用此方法的现存数组的一个浅拷贝
- 数据类型如字符串,数字,布尔(不是包装类对象),concat将字符串和数字的值复制到新数组中 [].concat('str') --> ['s', 't', 'r']
- 返回值是新的Array实例,所以如果省略了ValueN参数,则返回源数组的浅拷贝数组
js
Array.prototype.myConcat = function (/*valueN*/) {
var t = Object(this),
idx = t.length,
res = []
// 没有传递参数
for (var key in t) {
if (t.hasOwnProperty(key)) {
res[key] = t[key]
}
}
if (arguments.length > 0) {
// 传递参数
for (var key in arguments) {
var len = res.length
// 判断当前这个元素的类型,是值还是数组
if (arguments[key] instanceof Array) {
// 数组
for (var keys in arguments[key]) {
if (arguments[key].hasOwnProperty(keys)) {
res[len++] = arguments[key][keys]
}
}
} else {
// 值
res[len] = arguments[key]
}
}
return res
}
return res
}
Array.prototype.slice
- 参数问题:
- begin:提取起始值处的索引(从0开始),从该索引开始提取原数组元素。如果该参数为负数,则表示从原数组中的倒数第几个元素开始提取,slice(-2)表示提取原数组中的倒数第二个元素到最后一个元素。如果省略begin,则slice从索引0开始。如果begin超出数组的索引范围,则会返回空数组
- end:提取终止处的索引(从0开始),在该索引处结束提取原数组元素。slice会提取原数组中索引从bengin到end的所有元素,范围([begin, end))。如果该参数为负数,则它表示在原数组中的倒数第几个元素结束抽取。如果end被省略,则slice会一直提取到原数组的末尾。如果end大于数组的长度,slice也会一直提取到原数组末尾
- 返回值是一个含有被提取元素的新数组
js
Array.prototype.mySlice = function (/*begin, end*/) {
var t = this,
len = this.length,
idx = -1
;(begin = arguments[0] != undefined ? (arguments[0] < 0 ? len + arguments[0] : 0) : 0),
(end = arguments[1] != undefined ? (arguments[1] < 0 ? len + arguments[1] : arguments[1]) : len),
(res = [])
if (end >= len) {
end = len
}
for (var key in t) {
if (t.hasOwnProperty(key)) {
if (key >= begin && key < end) {
res[++idx] = t[key]
}
}
}
return res
}